/*
 * p10173.cpp
 *
 *  Created on: 2013-3-17
 *      Author: zy
 */


#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;

const int maxn=1010;
int sig(double d) {
	return fabs(d) < 1E-6 ? 0 : d < 0 ? -1 : 1;
}
struct Point{
	double x, y;
	double k;
	Point(){}
	Point(double x, double y): x(x), y(y) {}
	void set(double x, double y) {
		this->x = x;
		this->y = y;
	}
	double mod(){//模
		return sqrt(x*x+y*y);
	}
	double mod_pow(){//模的平方
		return x*x + y*y;
	}
	void output() {
		printf("x = %f, y = %f\n", x, y);
	}
	bool operator < (const Point &p) const {
		return sig(x-p.x) != 0 ? x < p.x : sig(y-p.y) < 0;
	}
};

double cross(Point o, Point a, Point b) {
	return (a.x - o.x)*(b.y - o.y)-(b.x - o.x)*(a.y - o.y);
}
double dot(Point &o, Point &a, Point &b) {
	return (a.x-o.x)*(b.x-o.x) + (a.y-o.y)*(b.y-o.y);
}
int btw(Point &x, Point &a, Point &b) {
	return sig(dot(x, a, b));
}

//按x从小到大排序，向右走为合法
int graham(Point*p, int n, int*ch)
{
	#define push(x)     ch[len ++]=x
	#define pop()		len --
	sort(p, p+n);
	int len = 0, len0 = 1, i;
	for(i = 0; i < n; i ++)
	{
		while(len > len0 && sig(cross(p[ch[len-1]], p[ch[len-2]], p[i]))<=0)
			pop();
		push(i);
	}
	len0 = len;
	for(i = n-2; i >= 0; i --) {
		while(len > len0 && sig(cross(p[ch[len-1]], p[ch[len-2]], p[i]))<=0)
			pop();
		push(i);
	}
	return len-1;
}


/*
 * 多边形有向面积，逆时针输入为正！
 */
double area(Point * p, int n) {
	double res = 0;
	p[n] = p[0];
	for(int i = 0; i < n; i ++) {
		res += p[i].x*p[i+1].y - p[i+1].x*p[i].y;
	}
	return res / 2;
}
double dis(Point a, Point b) {
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}


//返回o到线段ab的最短距离
double minDis(Point o, Point a, Point b) {
	if(sig(dot(b, a, o))<0)	return dis(o, b);
	if(sig(dot(a, b, o))<0)	return dis(o, a);
	return fabs(cross(o, a, b)/dis(a, b));
}
//计算从curAng逆时针转到ab的角
double calRotate(Point a, Point b, double curAng) {
	double x = fmod(atan2(b.y-a.y, b.x-a.x)-curAng, M_PI*2);
	if(x<0)			x += M_PI*2;
	if(x>1.9*M_PI)	x = 0;		//in case x is nearly 2*M_PI
	if(x >= 1.01*M_PI)	while(1);
	return x;
}
bool cmp2(const Point &a, const Point &b) {
	return sig(a.y-b.y)!=0 ? a.y<b.y : sig(a.x-b.x)>0;
}

//计算凸多边形的最小外接矩形面积
double minRect0(Point *p, int n) {
	if(n<=2)	return 0;
	if(area(p, n) < 0)	reverse(p, p+n);

	int ai = min_element(p, p+n)      -p;
	int bi = min_element(p, p+n, cmp2)-p;
	int ci = max_element(p, p+n)      -p;
	int di = max_element(p, p+n, cmp2)-p;
	int aj, bj, cj, dj;

	double res = 1E100, ang = -M_PI/2;
	double ra, rb, rc, rd, r, s, c, ac, bd;

	while(ang < M_PI * 0.51) {
		aj=(ai+1)%n;	ra = calRotate(p[ai], p[aj], ang);
		bj=(bi+1)%n;	rb = calRotate(p[bi], p[bj], ang+0.5*M_PI);
		cj=(ci+1)%n;	rc = calRotate(p[ci], p[cj], ang+1.0*M_PI);
		dj=(di+1)%n;	rd = calRotate(p[di], p[dj], ang+1.5*M_PI);
		r = min(min(ra,rb), min(rc,rd));
		ang += r;

		s = sin(ang), c = cos(ang);

		ac = -s*(p[ci].x-p[ai].x) + c*(p[ci].y-p[ai].y);
		bd =  c*(p[di].x-p[bi].x) + s*(p[di].y-p[bi].y);

		res = min(res, fabs(ac*bd));
			//改为(fabs(ac)+fabs(bd))*2就是求最小周长外接矩形

		if(sig(ra-r)==0)	ai=aj;
		if(sig(rb-r)==0)	bi=bj;
		if(sig(rc-r)==0)	ci=cj;
		if(sig(rd-r)==0)	di=dj;
	}
	return res==1E100 ? 0 : res;
}
//计算点集的最小外接举行面积，底层调用minRect0
double minRect(Point *p, int n) {
	static Point q[maxn];
	static int ch[maxn];
	int len = graham(p, n, ch);
	for(int i = 0; i < len; i ++)	q[i] = p[ch[len-1-i]];
	return minRect0(q, len);
}
Point P[maxn];
int n;
int main()
{
	while(scanf("%d", &n), n)
	{
		for(int i = 0; i < n; i ++)	scanf("%lf%lf", &P[i].x, &P[i].y);
		printf("%.4f\n", minRect(P, n));
	}
	return 0;
}

